<?php
class Counter {
    function __construct() {
        // Liest die IP aus!
        $this->ip_address = $_SERVER['REMOTE_ADDR'];
    }

    private function getVisitorsCount() {
        $sql = "SELECT
                    counts
                FROM
                    counter_visitors";
        try {
            $result = $this->db->query($sql);
            $resultSet = $this->db->fetch_object($result);
            return $resultSet->counts;
        } catch (Exception $e) {
            #$this->db->raise_error();
            return false;
        }
        return false;

    }

    private function insertVisitor() {
        $sql = "INSERT
                    INTO
                counter_visitor_ips
                    (ip, access_time)
                        VALUES
                    (INET_ATON('" . $this->ip_address . "'), NOW())
                ON DUPLICATE KEY UPDATE
                    access_time = NOW()";
        try {
            $this->db->query($sql);
            return true;
        } catch (Exception $e) {
            #$this->db->raise_error();
            return false;
        }
        return false;
    }

    private function updateVisitorsCount() {
        $sql = "UPDATE
                    counter_visitors
                SET
                    counts = counts + 1";
        try {
            $this->db->query($sql);
            return true;
        } catch (Exception $e) {
            #$this->db->raise_error();
            return false;
        }
    }

    public function count() {
        $sql = "SELECT
                    COUNT(ip) as count
                FROM
                    counter_visitor_ips
                WHERE
                    ip = INET_ATON('" . $this->ip_address . "')
                        AND
                    (NOW() - INTERVAL 3 HOUR) < access_time";
        try {
            $query = $this->db->query($sql);
            $result = $this->db->fetch_object($query);
            /*
             * bei jedem Seitenaufruf wird die aktuelle Zeit mit der aktuellen
             * IP-Adresse entweder neu in die Datenbank eingefuegt oder
             * die Zeit akualisiert
             */
            $this->insertVisitor();
            /*
             * wenn kein Besucher gefunden wurde, dessen IP-Adresse der aktuellen IP-Adresse entspricht
             * und wenn doch die Zeit des letzten Besuchs nicht weniger als 3 Stunden her ist
             * dann wird der Counter nach oben gezaehlt
             */
            if ($result->count == 0)
                $this->updateVisitorsCount();
        } catch (Exception $e) {
            #$this->db->raise_error();
        }
        // in jedem Fall wird der aktuelle Wert des Besucherzaehlers zurueckgegeben
        return $this->getVisitorsCount();
    }
}
?>